package rpc

import (
	"encoding/json"
	"github.com/golang/protobuf/jsonpb"
	"github.com/golang/protobuf/proto"
	"grpc.getaway.adminspro.padmins.com/pkg/libs/utils"
)

// 防止json中列表返回null值，应该返回[]
func ProtoMessageToList(m []proto.Message) []map[string]interface{} {
	list := make([]string, len(m))

	for i, message := range m {
		list[i] = marshalToString(message)
	}

	s := "[" + utils.Implode(",", list) + "]"

	out := []map[string]interface{}{}
	_ = json.Unmarshal([]byte(s), &out)
	return out
}

// 防止json中对象返回null值，应该返回{}
func ProtoMessageToMap(m proto.Message) map[string]interface{} {
	out := map[string]interface{}{}
	_ = json.Unmarshal([]byte(marshalToString(m)), &out)
	return out
}

func marshalToString(m proto.Message) string {
	marshaler := jsonpb.Marshaler{
		OrigName:     true,  // 是否使用原生的proto协议中的字段
		EnumsAsInts:  false, // 是否将枚举值设定为整数，而不是字符串类型
		EmitDefaults: true,  // 是否将字段值为空的渲染到JSON结构中
	}
	s, _ := marshaler.MarshalToString(m)
	return s
}
